package com.qqn.kuangbiao.class3_21;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

/**
 * 无重复字符的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长 子串 的长度。
 */
public class algorithm01 {  // dasduqweqeciff
    /*
    改进一下评论区大佬的答案，大佬用Set，面试的时候有可能被问Set不是有序的序列 会不会造成计算错误，改成ArrayList不会被问这个问题，
    也不需要关心滑动窗口的左边下标。 如果面试问的不是最大长度而是最大长度的子字符串也好改进 再添加一个ArrayList记录最大值时的数组就可以了
     */
    // mid 变量的定义争取最小作用域有效 所以尽量不要写在循环外面
    // public static int lengthOfLongestSubstring(String s) {
    //     int max = 0;
    //     int index = 0;
    //     ArrayList<Character> arrayList = new ArrayList<>();
    //     while (index < s.length()) {
    //         if (!arrayList.contains(s.charAt(index))) {
    //             arrayList.add(s.charAt(index));
    //             index++;
    //             max = Math.max(max, arrayList.size());
    //         } else {
    //             arrayList.remove(0);
    //         }
    //     }
    //     return max;
    // }

    public static int lengthOfLongestSubstring(String s) {
        // 只关注两个端点即可
        char[] ss = s.toCharArray();
        int max = 0;
        Set<Character> set = new HashSet<>();
        for (int right = 0, left = 0; right < s.length(); right++) {
            while (set.contains(ss[right])) { // 如果有就一直清楚现有的内容知道将重复的那个也清掉，相当于原来set的不要了
                set.remove(ss[left]);
                left++;
            }
            set.add(ss[right]);
            max = Math.max(max, right - left + 1);
        }
        return max;
    }


    public static void main(String[] args) {
        int max = lengthOfLongestSubstring("pwwkew");
        System.out.println(max);

    }
}
